package com.doitedu.core2

import com.doitedu.utils.SparkUtil
import org.apache.spark.rdd.RDD

/**
 * @Date: 22.7.4 
 * @Author: HANGGE
 * @qq: 598196583
 * @Tips: 学大数据 ,到多易教育
 * @Description:
 */
object C05_缓存 {
  def main(args: Array[String]): Unit = {

    val sc = SparkUtil.getSparkContext("缓存")
    val rdd1 = sc.makeRDD(List(1, 2, 3))

    val rdd2: RDD[Int] = rdd1.map(e=>{
      println("第一步...")
      e*10
    })

    val rdd3 = rdd2.map(e=>{
      println("第二步...")
      e+5
    })

    val rdd4 = rdd3.map(e=>{
      println("第三步...")
      ("hello", e)
    })


    val rdd5 = rdd4.map(tp => {
      println("第四步...")
      tp._1 + tp._2
    })

    /**
     *将RDD5进行缓存  cache()  persist()
     *   RDD5处理后的结果数据 会被缓存起来 , 被后续的多个JOB使用
     *   前面获取RDD5 的计算逻辑就只执行一次| 提成处理数据的效率
     *   注意: 只有RDD5这个算子被后续的多次使用 缓存才有意义
     *
     *  BlockMange统一管理缓存数据
     *    数据默认存储在哪:内存中
     *  val NONE
        val DISK_ONLY 数据仅存储在磁盘
        val DISK_ONLY_2 数据仅存储在磁盘并存储2份数据
        val DISK_ONLY_3 数据仅存储在磁盘并存储3份数据
        val MEMORY_ONLY 数据仅存储在内存
        val MEMORY_ONLY_2 数据仅存储在内存并存储2份数据
        val MEMORY_ONLY_SER  数据仅存储在内存并以序列化的方式存储数据  KRYO
        val MEMORY_ONLY_SER_2
        val MEMORY_AND_DISK
        val MEMORY_AND_DISK_2
        val MEMORY_AND_DISK_SER
        val MEMORY_AND_DISK_SER_2
        val OFF_HEAP  堆外内存     堆  JVM   12G    20G

     */
    // rdd5.cache()
     rdd5.persist()  // 底层是:  persist(StorageLevel.MEMORY_ONLY)

    /**
     * 操作1  submitJob
     *   触发行动算子运行一个JOB1
     */
    val res = rdd5.map(_.toUpperCase()).foreach(println)

    /**
     * 操作2   submitJob
     * 触发行动算子  运行一个JOB2
     */
    rdd5.filter(_.startsWith("h")).foreach(println)

    // 立即清除缓存数据
    rdd5.unpersist()

    sc.stop()

  }

}
